home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / msdos / 2hc / 2hc.asm next >
Encoding:
Assembly Source File  |  1991-10-19  |  5.6 KB  |  332 lines

  1. ;
  2. ;    FMR/FM-Towns 用 2HC Disk Driver
  3. ;     by S.Hagihira 
  4. ;    (NEW ON)
  5. ;     Nifty ID:PGB00174)
  6. ;     Nanno-Net Staff
  7. ;      1991.03.14    Ver 1.00
  8. ;      1991.03.16    Ver 1.01    drive No. 表示
  9. ;
  10. ;    増設ドライブも使う場合はN_Drvを4 とし、
  11. ;    dskbpbとinit_tblを4 台分作成するとよい
  12. ;
  13. ;    現在のところ読み込みのみのサポート
  14. ;
  15. N_Drv    equ    2
  16. DSK_1MB    equ    20h
  17. CR    equ    0Dh
  18. LF    equ    0Ah
  19. ;
  20. code    segment
  21.     assume    cs:code,ds:code,es:code,ss:code
  22. ;
  23. ;    device header
  24. ;
  25. dskdev    label    word
  26.     dd    -1        ;last device
  27.     dw    0000h        ;block device/IBM format
  28.     dw    strategy    ;strategy entry point
  29.     dw    dsk_int        ;interrupt entry point
  30. dsknum    db    N_Drv        ;units
  31.  
  32. dsktbl    label    word
  33.     dw    _init        ;initialize
  34.     dw    media_chk    ;media check
  35.     dw    get_bpb        ;build bpb
  36.     dw    cmd_err        ;ioctl input
  37.     dw    dsk_read    ;disk read
  38.     dw    exit
  39.     dw    exit
  40.     dw    exit
  41.     dw    dsk_wrt        ;disk write
  42.     dw    dsk_wrtv    ;disk write and verify
  43.     dw    exit
  44.     dw    exit
  45.     dw    exit
  46. ;
  47. packet    dd    0
  48. ;
  49. ;    strategy
  50. ;
  51. stratp    proc    far
  52. strategy:
  53.     mov    word ptr cs:[packet],bx
  54.     mov    word ptr cs:[packet+2],es
  55.     ret
  56. stratp    endp
  57. ;
  58. ;    defintion of BPB
  59. ;
  60. bpb        struc
  61.         dw    ?    ;logical sector size
  62. allc_sec    db    ?    ;sector/allocation bit
  63.         dw    ?    ;resetve sector
  64.         db    ?    ;copy of FAT
  65. dir_ent        dw    ?    ;directory entry
  66. tot_sct        dw    ?    ;sector/volume
  67.         db    ?    ;media descriptor byte
  68. fat_sec        dw    ?    ;sector/fat
  69. bpb        ends
  70. ;
  71. ;    defintion of reqest header for Read/Write/Verify
  72. ;
  73. req_head    struc
  74. cmdlen        db    ?    ;command length
  75. unit        db    ?    ;unit code
  76. cmd        db    ?    ;command code
  77. status        dw    ?    ;status
  78.         db    8 dup (?)
  79. media        db    ?    ;media descripter byte
  80. trans        dd    ?    ;transfer address
  81. count        dw    ?    ;sector count
  82. start        dw    ?    ;start sector number
  83. req_head    ends
  84. ;
  85. ;    definition of requset header for Init
  86. ;
  87. req_head_i    struc
  88.         db    13
  89. n_unit        db    ?    ; unit count
  90. break_adr    dd    ?    ; break address
  91. bpb_ptr        dd    ?    ; pointer for BPB
  92. block_dev_n    db    ?    ; block device number
  93. req_head_i    ends
  94. ;
  95. ;    interrupt routine
  96. ;
  97. dsk_int:
  98.     push    si
  99.     push    ax
  100.     push    cx
  101.     push    dx
  102.     push    di
  103.     push    bp
  104.     push    ds
  105.     push    es
  106.     push    bx
  107.  
  108.     lds    bx,cs:[packet]
  109.  
  110.     mov    al,[bx].unit
  111.     mov    ah,[bx].media
  112.     mov    cs:[unit_no],al
  113.     mov    cx,[bx].count
  114.     mov    dx,[bx].start
  115.     xchg    ax,di
  116.     mov    al,[bx].cmd
  117.     cmp    al,11
  118.     ja    cmd_err
  119.     xor    ah,ah
  120.     shl    ax,1
  121.     mov    si,offset dsktbl
  122.     add    si,ax
  123.     xchg    ax,di
  124.     les    di,[bx].trans
  125.     push    cs
  126.     pop    ds
  127.     jmp    [si]
  128. ;
  129. ;    exit
  130. ;
  131.  
  132. cmd_err:
  133.     mov    al,3
  134.  
  135. err_exit:
  136.     mov    ah,81h
  137.     jmp    short exit1
  138.  
  139. exitp    proc    far
  140. exit:
  141.     mov    ah,1
  142. exit1:
  143.     lds    bx,cs:[packet]
  144.     mov    [bx].status,ax
  145.  
  146.     pop    bx
  147.     pop    es
  148.     pop    ds
  149.     pop    bp
  150.     pop    di
  151.     pop    dx
  152.     pop    cx
  153.     pop    ax
  154.     pop    si
  155.     ret
  156. exitp    endp
  157. ;
  158. ;    command process routines
  159. ;
  160.  
  161. media_chk:            ;media check
  162.     lds    bx,[packet]
  163.     mov    byte ptr [bx].trans,1
  164.     jmp    exit
  165.  
  166. ;
  167. get_bpb:
  168.     mov    ah,es:[di]
  169.     mov    si,offset dskbpb
  170.     lds    bx,[packet]
  171.     mov    [bx].media,ah
  172.     mov    al,[bx].unit
  173.     mov    ah,13
  174.     mul    ah
  175.     add    si,ax
  176.     mov    [bx].count,si
  177.     mov    [bx].count+2,cs
  178.     jmp    exit
  179.  
  180. ;
  181. dsk_read:
  182.     mov    rw_flg,0
  183.     mov    vrfy_flg,0
  184.     jmp    rw_common
  185. ;
  186. dsk_wrt:
  187. ;    mov    rw_flg,1
  188. ;    mov    vrfy_flg,0
  189. ;    jmp    rw_common
  190. ;
  191. dsk_wrtv:
  192. ;    mov    rw_flg,1
  193. ;    mov    vrfy_flg,1
  194. ;    jmp    rw_common
  195.     mov    al,10    ; Write Error
  196.     push    ds
  197.     xor    cx,cx
  198.     lds    bx,cs:[packet]
  199.     mov    [bx].count,cx    ;set transmitted sector no.
  200.     pop    ds
  201.     jmp    err_exit
  202. ;
  203. rw_common:
  204.     push    di    ; transfer offset
  205.     push    es    ; transfer segment
  206.     push    cx    ; transfer count
  207.     push    dx    ; start sector
  208. ;
  209. ;    Get Drive mode
  210. ;
  211.     mov    ax,0100h+DSK_1MB
  212.     add    al,byte ptr unit_no
  213.     mov    byte ptr dev_no,al
  214.     int    93h
  215.     mov    byte ptr drv_mode1,dl
  216.     mov    word ptr drv_mode2,bx
  217. ;
  218. ;    Set Drive mode to 2HC (2ED)
  219. ;
  220.     xor    ah,ah    
  221.     mov    al,byte ptr dev_no
  222.     mov    dl,42h    ; 2ED, 512 bytes/sector
  223.     mov    bx,0212h    ; 2 heads, 18 sectors/track
  224.     int    93h
  225. ;
  226. ;    Logical Sector No. => Physical Sector No.
  227. ;
  228.     pop    ax
  229. ;    shl    ax,1
  230.     xor    dx,dx
  231.     mov    cx,18    ; (18 sectors/ track)
  232.     div    cx    ; dl = sector no.
  233.     inc    dl    ; physical sector starts from 1
  234.     mov    cx,ax
  235.     xor    dh,dh
  236.     shr    cx,1    ; track no.set ( /2 ... 2 sides)
  237.     adc    dh,0    ; side no. set
  238.     mov    al,byte ptr dev_no
  239.     mov    ah,5    ; Secter Read command
  240.     cmp    byte ptr rw_flg,0
  241.     jz    rw_r
  242.     mov    ah,6    ; Sector Write command
  243. rw_r:    pop    bx    ; transfer count
  244. ;    shl    bx,1
  245.     pop    ds    ; transfer segment
  246.     pop    di    ; transfer offset
  247.     push    bx
  248.     int    93h
  249.     mov    dx,cx    ; error code convert
  250.     pop    cx
  251.     sub    cx,bx    ; r/w sector count
  252.     lds    bx,cs:[packet]
  253.     mov    [bx].count,cx    ;set transmitted sector no.
  254.     push    ax    ; error status save
  255. ;
  256. ;    Reset Drive mode
  257. ;
  258.     push    cs
  259.     pop    ds
  260.     xor    ah,ah
  261.     mov    al,byte ptr dev_no
  262.     mov    dl,byte ptr drv_mode1
  263.     mov    bx,word ptr drv_mode2
  264.     int    93h
  265. ;
  266. ;    Error check
  267. ;
  268.     pop    ax
  269.     mov    al,ah
  270.     cmp    al,0
  271.     jz    rw_ok
  272.     cmp    byte ptr rw_flg,0
  273.     jz    r_err
  274.     mov    al,10    ; Write Error
  275.     jmp    err_exit
  276. r_err:    mov    al,11    ; Read Error
  277.     jmp    err_exit
  278. rw_ok:    jmp    exit
  279. ;
  280. ;    data
  281. ;
  282. rw_flg        db    ?    ;0 : read
  283.                 ;1 : write
  284. vrfy_flg    db    ?    ;0 : verify off
  285.                 ;1 : verify on
  286. unit_no        db    ?
  287. dev_no        db    ?
  288. drv_mode1    db    ?
  289. drv_mode2    dw    ?
  290. ;
  291. dskbpb:
  292.     include    bpb_2hc.asm
  293. ;
  294. op_mesa:
  295.     db    CR,LF,' FMR/FM-Towns 2HC Disk Driver Ver 1.01',CR,LF
  296.     db    '   1991.03.14 Read only supported',CR,LF
  297.     db    '  by S.Hagihira (NEW ON/ Nifty ID: PGB00174)',CR,LF,LF
  298.     db    '内蔵ドライブ0,1をドライブ'
  299. d_no0:    db    ?
  300.     db    ','
  301. d_no1:    db    ?
  302.     db    'で2HC モードアクセス可能です。',CR,LF,LF,'$'
  303. ;
  304. _init:
  305. ;
  306.     push    cs
  307.     pop    ds
  308. ;
  309.     mov    al,N_Drv
  310.     push    ds
  311. ;
  312.     lds    bx,[packet]    ;get strategy pointer
  313.     mov    [bx].media,al    ;set unit count
  314.     mov    al,byte ptr [bx].count+4    ; get block device No.
  315.     mov    word ptr [bx].trans,offset op_mesa    ;set break address
  316.     mov    word ptr [bx].trans+2,cs
  317.     mov    word ptr [bx].count+2,cs    ;set pointer for BPB
  318.     mov    word ptr [bx].count,offset init_tbl
  319. ;
  320.     pop    ds
  321.     add    al,'A'
  322.     mov    byte ptr d_no0,al
  323.     inc    al
  324.     mov    byte ptr d_no1,al
  325.     mov    dx,offset op_mesa
  326.     mov    ah,9
  327.     int    21h
  328.     jmp    exit
  329. ;
  330. code    ends
  331.     end
  332.